home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
076-100
/
084
/
gravitywars
/
mywindow.mod
< prev
next >
Wrap
Text File
|
1995-03-13
|
14KB
|
401 lines
IMPLEMENTATION MODULE MyWindow;
(*+,+*)
(**********************************************************************
*************** Written by Ed Bartz ***************
*************** Copyright 5/21/87 ***************
*************** This program may be redistributed ***************
*************** or modified as long as these ***************
*************** notices and all other references ***************
*************** to the author remain intack. ***************
*************** Also this may not be used for ***************
*************** profit by anyone without the ***************
*************** express permission of the author. ***************
**********************************************************************)
FROM Ports IMPORT ReplyMsg, WaitPort, GetMsg, MessagePtr;
FROM Colors IMPORT SetRGB4;
FROM Libraries IMPORT OpenLibrary, CloseLibrary;
FROM SYSTEM IMPORT ADR, BYTE, ADDRESS, NULL;
FROM Intuition IMPORT
IntuitionName, IntuitionBase, Window, WindowFlags, NewWindow,
MenuPick, IDCMPFlagSet, WindowFlagSet, WindowPtr, ScreenPtr,
MenuEnabled, MenuFlagSet, Menu, MenuItem, IntuitionText, ActiveWindow,
ItemFlagSet, ItemText, ItemEnabled, IntuiMessagePtr, CustomScreen,
MouseButtons, SelectDown, CheckIt, MenuToggle, InactiveWindow;
FROM GraphicsLibrary IMPORT GraphicsName, GraphicsBase, Jam2, Jam1,
DrawingModeSet;
FROM Windows IMPORT OpenWindow, CloseWindow, ModifyIDCMP;
FROM Screens IMPORT
NewScreenPtr, NewScreen, OpenScreen, CloseScreen, ShowTitle;
FROM Views IMPORT Lace, Hires, ModeSet;
FROM Menus IMPORT HighComp, SetMenuStrip;
FROM Text IMPORT TextAttr,Text,NormalStyle,FontFlags,FontFlagSet;
FROM Console IMPORT OpenWConsole,CloseWConsole,Conport;
PROCEDURE OpenLibraries () : BOOLEAN;
BEGIN
(* First open intuition library *)
IntuitionBase := OpenLibrary (IntuitionName, 0);
IF IntuitionBase = 0 THEN RETURN FALSE END;
(* Now open the graphics library *)
GraphicsBase := OpenLibrary (GraphicsName, 0);
IF GraphicsBase = 0 THEN RETURN FALSE END;
RETURN TRUE
END OpenLibraries;
(*++++++++++++++++++++++++++++++++++++++ *)
PROCEDURE InitScreen () : ScreenPtr;
VAR
s : NewScreenPtr;
GravityWarsName : ARRAY [0..15] OF CHAR;
FontType : ARRAY [0..15] OF CHAR;
textattr : TextAttr;
BEGIN
FontType := "topaz.font";
GravityWarsName := "GravityWars";
WITH s^ DO
LeftEdge := 0; TopEdge := 0;
Width := 640; Height := 400;
Depth := 4;
DetailPen := BYTE (0); BlockPen := BYTE (1);
ViewModes := ModeSet {Lace, Hires};
Type := CustomScreen;
Font := ADR(textattr);
DefaultTitle := ADR (GravityWarsName);
Gadgets := NULL;
CustomBitMap := NULL
END;
WITH textattr DO
taName :=ADR(FontType);
taYSize := 9;
taStyle := NormalStyle;
taFlags := FontFlagSet{ROMFont};
END;
(* Now open the screen *)
RETURN OpenScreen (s)
END InitScreen;
(*++++++++++++++++++++++++++++++++++++++ *)
(* Initialize and open a window. *)
PROCEDURE InitWindow (screen : ScreenPtr) : WindowPtr;
VAR
w : NewWindow;
BEGIN
WITH w DO
LeftEdge := 0; TopEdge := 0; Width := 640; Height := 400;
DetailPen := BYTE (0);
BlockPen := BYTE (1);
Title := NULL;
Flags := WindowFlagSet {Activate, Borderless};
IDCMPFlags := IDCMPFlagSet {MenuPick,MouseButtons};
Type := CustomScreen;
CheckMark := NULL;
FirstGadget := NULL;;
Screen := screen;
BitMap := NULL;
MinWidth := 10; MinHeight := 10;
MaxWidth := 640; MaxHeight := 400;
END;
(* Now open the window *)
RETURN OpenWindow (w)
END InitWindow;
(*++++++++++++++++++++++++++++++++++++++ *)
(* Initialize and open an IO window. *)
PROCEDURE OpenIOWin(VAR W: Conport;VAR w :WindowPtr; scn: ScreenPtr): BOOLEAN;
VAR
Win : NewWindow;
error : LONGINT;
BEGIN
WITH Win DO
LeftEdge := 0; TopEdge := 0; Width := 640; Height := 30;
DetailPen := BYTE (2);
BlockPen := BYTE (1);
Title := NULL;
Flags := WindowFlagSet {Borderless};
IDCMPFlags := IDCMPFlagSet {InactiveWindow};
Type := CustomScreen;
CheckMark := NULL;
FirstGadget := NULL;;
Screen := scn;
BitMap := NULL;
MinWidth := 639; MinHeight := 10;
MaxWidth := 640; MaxHeight := 50;
END;
(* Now open the window *)
w:=OpenWindow(Win);
RETURN OpenWConsole(W,w);
END OpenIOWin;
(*++++++++++++++++++++++++++++++++++++++ *)
PROCEDURE CloseIOWin (VAR W: Conport;w :WindowPtr );
BEGIN
CloseWConsole(W);
CloseWindow(w);
END CloseIOWin;
(*++++++++++++++++++++++++++++++++++++++ *)
PROCEDURE InitMenu (VAR GravityWarsmenu: MenuData);
PROCEDURE InitItems ();
VAR
i : CARDINAL;
BEGIN
WITH GravityWarsmenu DO
FOR i := 0 TO 34 DO
(* Initialize Item record fields *)
WITH Items[i] DO
NextItem := ADR (Items[i+1]);
IF ((i=8) OR (i=12) OR (i=17) OR (i=22) OR (i=34)) THEN
NextItem := NULL
END;
LeftEdge := 0;
Width := 190; Height := 10;
Flags := ItemFlagSet {ItemText, ItemEnabled} + HighComp;
MutualExclude := 0;
ItemFill := ADR (Itemtext[i]);
SelectFill := NULL; Command := BYTE (0);
SubItem := NULL; NextSelect := 0;
END;
WITH Itemtext [i] DO
FrontPen := BYTE(0); BackPen := BYTE (1);
DrawMode := BYTE (DrawingModeSet {Jam2});
LeftEdge := 0; TopEdge := 1;
ITextFont := NULL; NextText := NULL;
IText := ADR (Text[i])
END;
END;
FOR i:= 0 TO 8 DO
Items[i].TopEdge := i* 10;
Items[i].Width := 250;
END;
FOR i:= 9 TO 12 DO
Items[i].TopEdge := (i-9) * 10;
Items[i].Width := 120;
END;
FOR i:= 13 TO 17 DO
Items[i].TopEdge := (i-13) * 10;
Items[i].Width := 230;
END;
FOR i:= 18 TO 22 DO
Items[i].TopEdge := (i-18) * 10;
Items[i].Width := 130;
END;
FOR i:= 23 TO 34 DO
Items[i].TopEdge := (i-23) * 10;
END;
(* Now put text into the text arrays *)
Text[0] := "written by Ed Bartz";
Text[1] := "with TDI Modula 2";
Text[2] := " Version 1.04";
Text[3] := " Copyright March 1987";
Text[4] := " ";
Text[5] := "This Program is Shareware";
Text[6] := "Send Donation to ";
Text[7] := " 12 Roosevelt St.";
Text[8] := " SouthRiver,N.J. 08882";
Text[9] := "Random Setup ";
Text[10] := "Play Game";
Text[11] := "Stop Game";
Text[12] := "Quit";
Text[13] := "Maximum Planets = 9";
Text[14] := "Erase Missle Trails";
Text[15] := "Redraw Screen";
Text[16] := "Plain Planets";
Text[17] := "Practice";
Text[18] := "Move Ship";
Text[19] := "Move Planet";
Text[20] := "Change Planet";
Text[21] := "Make Planet";
Text[22] := "Delete Planet";
Text[23] := "Velocity: 0 to 10";
Text[24] := " ";
Text[25] := "Angle: 90";
Text[26] := " |";
Text[27] := " 180 --+-- 0";
Text[28] := " |";
Text[29] := " 270";
Text[30] := " ";
Text[31] := "Planet Density:";
Text[32] := " Low - Red";
Text[33] := " Medium - Green";
Text[34] := " High - Blue ";
END;
END InitItems;
BEGIN
InitItems ();
(* Init the single menu *)
WITH GravityWarsmenu DO
WITH menu[0] DO
NextMenu := ADR (menu[1]);
LeftEdge := 3; TopEdge := 0;
Width := 55; Height := 10;
Flags := MenuFlagSet {MenuEnabled};
FirstItem := ADR (Items[0]);
MenuName := ADR (menuname[0])
END;
WITH menu[1] DO
NextMenu := ADR (menu[2]);
LeftEdge := 65; TopEdge := 0;
Width := 44; Height := 10;
Flags := MenuFlagSet {MenuEnabled};
FirstItem := ADR (Items[23]);
MenuName := ADR (menuname[1])
END;
WITH menu[2] DO
NextMenu := ADR (menu[3]);
LeftEdge := 119; TopEdge := 0;
Width := 132; Height := 10;
Flags := MenuFlagSet {MenuEnabled};
FirstItem := ADR (Items[9]);
MenuName := ADR (menuname[2])
END;
WITH menu[3] DO
NextMenu := ADR (menu[4]);
LeftEdge := 261; TopEdge := 0;
Width := 77; Height := 10;
Flags := MenuFlagSet {MenuEnabled};
FirstItem := ADR (Items[13]);
MenuName := ADR (menuname[3])
END;
WITH menu[4] DO
NextMenu := NULL;
LeftEdge := 348; TopEdge := 0;
Width := 132; Height := 10;
Flags := MenuFlagSet {MenuEnabled};
FirstItem := ADR (Items[18]);
MenuName := ADR (menuname[4])
END;
menuname[0] := "About";
menuname[1] := "Help";
menuname[2] := "Game Control";
menuname[3] := "Options";
menuname[4] := "Modify Setup";
END;
END InitMenu;
(*++++++++++++++++++++++++++++++++++++++ *)
PROCEDURE SetColors (sp : ScreenPtr);
BEGIN
WITH sp^ DO
SetRGB4 (ADR(VPort), 0, 0, 0, 0);
SetRGB4 (ADR(VPort), 1, 15, 15, 15);
SetRGB4 (ADR(VPort), 2, 15, 0, 0);
SetRGB4 (ADR(VPort), 3, 8, 8, 9);
SetRGB4 (ADR(VPort), 4, 6, 0, 0);
SetRGB4 (ADR(VPort), 5, 9, 1, 0);
SetRGB4 (ADR(VPort), 6, 12, 2, 0);
SetRGB4 (ADR(VPort), 7, 15, 3, 0);
SetRGB4 (ADR(VPort), 8, 0, 5, 0);
SetRGB4 (ADR(VPort), 9, 1, 8, 0);
SetRGB4 (ADR(VPort), 10, 2, 12, 0);
SetRGB4 (ADR(VPort), 11, 7, 15, 0);
SetRGB4 (ADR(VPort), 12, 0, 0, 6);
SetRGB4 (ADR(VPort), 13, 0, 2, 9);
SetRGB4 (ADR(VPort), 14, 0, 4, 12);
SetRGB4 (ADR(VPort), 15, 0, 6, 15);
END
END SetColors;
(*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
PROCEDURE ReadMenu(wp : WindowPtr): INTEGER;
CONST
MenuNull = 0FFFFH;
VAR
msgptr : IntuiMessagePtr;
code : CARDINAL;
class : IDCMPFlagSet;
(* ++++++++++++++++++++++++++++++++++++++ *)
(* Get the item number from the number *)
(* gotten from the intuition message. *)
PROCEDURE ItemPicked (code : CARDINAL) : CARDINAL;
TYPE
ShortSet = SET OF [0..15];
VAR
menunumber,code1 : CARDINAL;
BEGIN
code1 := code;
code1 := CARDINAL (ShortSet(code1) * ShortSet (0001FH));
code := CARDINAL (ShortSet(code DIV 32) * ShortSet (003FH));
IF (code1 = 0) THEN code:= 0;END;
IF (code1 = 1) THEN code:= 0;END;
IF (code1 = 2) THEN code:= code + 1;END;
IF (code1 = 3) THEN code:= code + 5;END;
IF (code1 = 4) THEN code:= code + 10;END;
RETURN code
END ItemPicked;
BEGIN
msgptr := GetMsg (wp^.UserPort);
IF msgptr <> NULL THEN
(* If message is gotten. Process it *)
REPEAT
class := msgptr^.Class; code := msgptr^.Code;
ReplyMsg (MessagePtr(msgptr));
msgptr := GetMsg (wp^.UserPort);
(* If something was picked from the menu, act on it *)
(* If not a menu event check next message *)
UNTIL ((msgptr=NULL) OR (class = IDCMPFlagSet {MenuPick}));
IF (class = IDCMPFlagSet {MenuPick}) AND (code <> MenuNull) THEN
(* Figure out what item was picked *)
RETURN ItemPicked (code);
END
END; (* IF msgptr <> NULL *)
RETURN 0;
END ReadMenu;
(*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
PROCEDURE QueueMenu(wp : WindowPtr): BOOLEAN;
CONST
MenuNull = 0FFFFH;
VAR
msgptr : IntuiMessagePtr;
code : CARDINAL;
class : IDCMPFlagSet;
BEGIN
msgptr := GetMsg (wp^.UserPort);
IF msgptr <> NULL THEN
REPEAT
class := msgptr^.Class; code := msgptr^.Code;
msgptr := GetMsg (wp^.UserPort);
UNTIL ((msgptr=NULL) OR (class = IDCMPFlagSet {MenuPick}));
IF (class = IDCMPFlagSet {MenuPick}) AND (code <> MenuNull) THEN
RETURN TRUE;
END
END;
RETURN FALSE;
END QueueMenu;
(*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
PROCEDURE ReadMouse(wp: WindowPtr;VAR x,y: CARDINAL);
VAR
msgptr : IntuiMessagePtr;
code : CARDINAL;
class : IDCMPFlagSet;
BEGIN
REPEAT
msgptr:= NULL;
WHILE (msgptr=NULL) DO
msgptr:= GetMsg(wp^.UserPort);
END;
class:= msgptr^.Class;
code:= msgptr^.Code;
x:= CARDINAL(ABS(msgptr^.MouseX));
y:= CARDINAL(ABS(msgptr^.MouseY));
ReplyMsg (MessagePtr(msgptr));
UNTIL ((class=IDCMPFlagSet{MouseButtons})AND(code=SelectDown));
END ReadMouse;
END MyWindow.